home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d20 / ibink10.arc / FIDOADR.C next >
C/C++ Source or Header  |  1991-03-09  |  3KB  |  179 lines

  1. /*
  2.  * Functions to convert to and from ASCII fidonet specs and their
  3.  * seperate entities.
  4.  *
  5.  * These are the valid FidoNet address specifictions:
  6.  *
  7.  * zone:net/node.point@domain
  8.  * zone:net/node.point
  9.  * zone:net/node@domain
  10.  * zone:net/node
  11.  * net/node.point@domain
  12.  * net/node.point
  13.  * net/node@domain
  14.  * net/node
  15.  * node.point@domain
  16.  * node.point
  17.  * node@domain
  18.  * node
  19.  */
  20.  
  21. #include <string.h>
  22.  
  23. #include "fidoadr.h"
  24.  
  25. /*
  26.  * Split a fido address into it's seperate parts.  The following are valid
  27.  * fido address specifictions.
  28.  */
  29. void fidoadr_split(char *addr, FIDOADR *fadr)
  30. {
  31.     char *p, *q;
  32.     char st[255];
  33.  
  34.     /*
  35.      * Zone
  36.      */
  37.     p = strchr(addr, ':');
  38.     if (p) fadr->zone = (word) atol(addr);
  39.     else fadr->zone = 0;
  40.     /*
  41.      * Net
  42.      */
  43.     p = strchr(addr, '/');
  44.     if (p) {
  45.         p--;
  46.         while (strchr("0123456789", *p) && (p >= addr)) p--;
  47.         p++;
  48.         fadr->net = (word) atol(p);
  49.     }
  50.     else fadr->net = 0;
  51.     /*
  52.      * Node
  53.      */
  54.     p = strchr(addr, '/');
  55.     if (p) {
  56.         p++;
  57.         fadr->node = (word) atol(p);
  58.     }
  59.     else fadr->node = (word) atol(addr);
  60.     /*
  61.      * Point
  62.      */
  63.     p = strchr(addr, '.');
  64.     if (p) {
  65.         p++;
  66.         fadr->point = (word) atol(p);
  67.     }
  68.     else fadr->point = 0;
  69.     /*
  70.      * Domain
  71.      */
  72.     p = strchr(addr, '@');
  73.     if (p) {
  74.         p++;
  75.         strcpy(fadr->domain, p);
  76.     }
  77.     else *(fadr->domain) = '\0';
  78. }
  79.  
  80. /*
  81.  * Merge the parts specified in FIDOADR into a ASCII fidonet specification
  82.  *
  83.  * Beware of results if you don't pass good values in FIDOADR.
  84.  *
  85.  */
  86. char *fidoadr_merge(char *addr, FIDOADR *fadr)
  87. {
  88.     static char tmp[64];
  89.  
  90.     *addr = '\0';
  91.     if (fadr->zone) {
  92.         ltoa((long)(fadr->zone), tmp, 10);
  93.         strcat(addr, tmp);
  94.         strcat(addr, ":");
  95.     }
  96.     if (fadr->zone || fadr->net) {
  97.         ltoa((long) fadr->net, tmp, 10);
  98.         strcat(addr, tmp);
  99.         strcat(addr, "/");
  100.     }
  101.     ltoa((long) fadr->node, tmp, 10);
  102.     strcat(addr, tmp);
  103.     if (fadr->point && fadr->node) {
  104.         strcat(addr, ".");
  105.         ltoa((long) fadr->point, tmp, 10);
  106.         strcat(addr, tmp);
  107.     }
  108.     if (*(fadr->domain)) {
  109.         strcat(addr, "@");
  110.         strcat(addr, fadr->domain);
  111.     }
  112.     return(addr);
  113. }
  114.  
  115. /*
  116.  * Simple 3-part address to string conversion
  117.  */
  118. char *fidostr(char *dest, word zone, word net, word node)
  119. {
  120.     FIDOADR    fadr=DEF_FIDOADR;
  121.  
  122.     fadr.zone = zone;
  123.     fadr.net = net;
  124.     fadr.node = node;
  125.     fidoadr_merge(dest, &fadr);
  126.     return(dest);
  127. }
  128.  
  129. /*
  130.  * Split simple 3-part address
  131.  */
  132. void fidosplit(char *src, word *zone, word *net, word *node)
  133. {
  134.     FIDOADR    fadr=DEF_FIDOADR;
  135.  
  136.     fidoadr_split(src, &fadr);
  137.     *zone = fadr.zone;
  138.     *net = fadr.net;
  139.     *node = fadr.node;
  140. }
  141.  
  142. /*
  143.  * Extract an 8 character hex filename net/node spec to numeric net & node
  144.  *
  145.  * "01180133" -> net=280 node=307
  146.  *
  147.  */
  148. void hexadr_split(char *hexadr, word *net, word *node)
  149. {
  150.     char tmp[5];
  151.  
  152.     tmp[4] = '\0';
  153.     /*
  154.      * Net
  155.      */
  156.     strncpy(tmp, hexadr, 4);
  157.     strupr(tmp);
  158.     sscanf(tmp, "%04x", net);
  159.     /*
  160.      * Node
  161.      */
  162.     strncpy(tmp, &(hexadr[4]), 4);
  163.     strupr(tmp);
  164.     sscanf(tmp, "%04x", node);
  165. }
  166.  
  167. /*
  168.  * Merge numeric net & node to an 8 character hex filename
  169.  *
  170.  * net=280 node=307 -> "01180133"
  171.  *
  172.  */
  173. char *hexadr_merge(char *hexadr, word net, word node)
  174. {
  175.     sprintf(hexadr, "%04X%04X", net, node);
  176.     return(hexadr);
  177. }
  178.  
  179.